[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた(Swift版)
1 はじめに
EarlGreyでは、テストコードをObjective-C/Swiftのどちらでも書くことができます。(ターゲットもどちらにでも対応できます) 前回は、テストコードをObjective-Cで書いたのですが、今回は、同プロジェクトに新しいテストスキームを追加してSwiftでテストを書いてみました。
前回のObjective-Cによるテスト、及びEarlGreyについては、下記をご参照ください。
[iOS] 明確で簡潔なテストを書くことができる iOS UI自動化テスト・フレームワークEarlGreyを試してみました。
[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた(Objective-C版)
2 EarlGreyの組み込み
(1) テストの追加
メニューからEditor - Add target - iOS - Test - iOS Unit Testing Bundle を選択し、新しいユニットテストを追加します。
名前をSampleAppSwiftTestsとし、Language:をSwiftにしました。
(2) スキームの追加
前回と要領は同じですが、新たにSwiftテスト用のスキームを追加します。
New Schemeから、ターゲットは、SampleAppSwiftTestsとしています。
ここでは、名前をSampleAppSwiftTestsとしました。
Manage Schemesを開いて、今追加したSampleAppSwiftTestsのSharedにチェックを入れます。
(3) Cocoapodによるインストール
新しいスキームを追加したので、改めてpod installが必要になります。
ここで一旦、Xcodeを終了し、Podfileを下記のように修正します。新たに作成したスキームに対してもEarlGreyを導入する感じです。
PROJECT_NAME = 'SampleApp' TEST_TARGET = 'SampleAppTests' SCHEME_FILE = 'SampleAppTests.xcscheme' TEST_TARGET_SWIFT = 'SampleAppSwiftTests' SCHEME_FILE_SWIFT = 'SampleAppSwiftTests.xcscheme' xcodeproj PROJECT_NAME target TEST_TARGET, :exclusive => true do pod 'EarlGrey' end xcodeproj PROJECT_NAME target TEST_TARGET_SWIFT, :exclusive => true do pod 'EarlGrey' end post_install do |installer| load('configure_earlgrey_pods.rb') configure_for_earlgrey(installer, PROJECT_NAME, TEST_TARGET, SCHEME_FILE) configure_for_earlgrey(installer, PROJECT_NAME, TEST_TARGET_SWIFT, SCHEME_FILE_SWIFT) end
このフォルダには、前回、configure_earlgrey_pods.rbをコピーしているので、このまま、pod installします。
※configure_earlgrey_pods.rbが無い場合は、前回記事をご参照ください。
[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた
$ pod install Updating local specs repositories CocoaPods 1.0.0.beta.5 is available. To update use: `gem install cocoapods --pre` [!] This is a test version we'd love you to try. For more information see http://blog.cocoapods.org and the CHANGELOG for this version http://git.io/BaH8pQ. Analyzing dependencies Downloading dependencies Using EarlGrey (1.0.0) Generating Pods project Checking and Updating SampleApp for EarlGrey. EarlGrey setup complete. You can use the Test Target : SampleAppTests for EarlGrey testing. Checking and Updating SampleApp for EarlGrey. Adding EarlGrey Framework Location as an Environment Variable EarlGrey setup complete. You can use the Test Target : SampleAppSwiftTests for EarlGrey testing. Integrating client project Sending stats Sending stats Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
(4) ワークスペースを開く
pod installで生成されたSampleApp.xcworkspaceをXcodeで開くと、次のような構成になっています。
(5) Copy Phase の追加
SampleAooSwiftTestsのBuild PhasesにもNew Copy Phaseを選択し、Phaseを1つ追加します。
追加したPhaseは、次のように設定します。(ここでは、分かりやすいように名前をEarlGray Copy Filesとしました)
- Destination:
Absolute Path
- Path:
$(TEST_HOST)/..
- Copy files only when installing: Deselect
- Name:
Path to EarlGrey.Framework
withCode Sign on Copy
selected.
3 テストの作成
(1) EarlGrey.swift
EarlGrey.swift をダウンロードして、SampleAppSwiftTestsの中に置きます。
(2) ブリッジヘッダの作成
EarlGreyは、Objectice-Cで作成されているため、Swiftでテストコードを書く場合は、ブリッジヘッダが必要になります。 ブリッジヘッダを作成して内容を下記のように編集します。
#import <EarlGrey/EarlGrey.h>
ここまでで、SampleAppSwiftTestは、次のような構成になります。
(3) テストコード
いよいよ、Swiftでテストコードを記述します。 内容は、前回と全く同じです。ただ、言語をSwiftに変更しただけです。
当然といえば、当然ですが、かなり簡潔になりました。
import XCTest class SampleAppSwiftTests: XCTestCase { func testLogin() { //***************************************************** // ログイン失敗 //***************************************************** let user = "taro" var pass = "xxx" // ユーザ名の入力 EarlGrey().selectElementWithMatcher(grey_accessibilityID("userTextField")).performAction(GREYActions.actionForTypeText(user)) // パスワードの入力 EarlGrey().selectElementWithMatcher(grey_accessibilityID("passwordTextField")).performAction(GREYActions.actionForTypeText(pass)) // ログインボタンを押す EarlGrey().selectElementWithMatcher(grey_accessibilityID("loginButton")).performAction(grey_tap()) // ERRORというテキストが表示されていることを確認する EarlGrey().selectElementWithMatcher(grey_text("ERROR")).assertWithMatcher(grey_sufficientlyVisible()) // OKボタンを押して、アラートを閉じる EarlGrey().selectElementWithMatcher(grey_text("OK")).performAction(grey_tap()) //***************************************************** // ログイン成功 //***************************************************** pass = "123" // 正しいパスワードに変更 // パスワードの修正 EarlGrey().selectElementWithMatcher(grey_accessibilityID("passwordTextField")) .performAction(grey_clearText()).performAction(GREYActions.actionForTypeText(pass)) // ログインボタンを押す EarlGrey().selectElementWithMatcher(grey_accessibilityID("loginButton")).performAction(grey_tap()) // SUCCESSというテキストが表示されていることを確認する EarlGrey().selectElementWithMatcher(grey_text("SUCCESS")).assertWithMatcher(grey_sufficientlyVisible()) // OKボタンを押して、アラートを閉じる EarlGrey().selectElementWithMatcher(grey_text("OK")).performAction(grey_tap()) } }
動作している様子については、前回と全く同じなので省略します。
4 最後に
今回は、Swiftでテストコードを書いてみましたが、EarlGreyの記述方法が、どんどん動作をつないでゆく感じなので、ドットだけで繋がっていけるSwiftの方が、見通しよく書ける感じがします。
連結が増えるとObjective-Cの[ ]は、やはりちょっと辛いです。
5 参考資料
[iOS] 明確で簡潔なテストを書くことができる iOS UI自動化テスト・フレームワークEarlGreyを試してみました。
[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた
EarlGrey - iOS 向けの UI 機能テスト フレームワーク
https://github.com/google/EarlGrey
iOS UIテストフレームワーク EarlGrey のセットアップ
http://www.testingexcellence.com/earlgrey-open-source-test-automation-tool-for-ios/
https://kazucocoa.wordpress.com/2016/02/17/ios-test-ui-with-googleearlgrey/